Intro and Methods
In this analysis I demonstrate the existence of a network of automated retweet bots that amplify a large set of establishment Democrats and members of “Resistance Twitter”. For data collection, I used the Twitter Search API via the rtweet r package to obtain retweeters of various accounts in different communities.
Two primary analyses were used to examine the retweeter data sets for each account, the first being account creation date distributions. When analyzing followers or retweeters for suspicious patterns, the date an account is created is a useful feature to look at because it is immutable. A user’s account creation date (i.e. when they joined twitter) cannot be changed by the account owner, so it is useful for observing interesting patterns associated with clusters of accounts created within short time spans. I recommend the NY Times Follower Factory article for relevant background regarding how account creation date patterns can reveal fake, often purchased, bot followers. In contrast to the NY Times article, this analysis focuses on the account creation dates of users that retweet particular accounts, rather than followers.
The second analysis, using a machine learning classification technique, was a probability estimate of an account being a bot. For this, I used the tweetbotornot r package to estimate the probability of each retweeter being an automated account. As in the account creation date analysis, distributions of bot probabilities were visualized to examine a large number of accounts at once. The fast version of the algorithm can be tested here on single accounts using account-level (bio, tweet volume, follower and friend count, etc.) data only. To obtain a more accurate estimate of whether an account is a bot or not, tweet-level (capitalization, hashtag use, mentions, etc.) data was used in addition to the account-level data. In the following analysis, tweet-level data consisted of retweeter’s most recent 100 tweets. The gradient boosted model (using the gbm package) used the combination of account and tweet-level data to estimate the probability that each retweeting account is a bot.
The proceeding sections are organized as such:
Data collection methodology
- Account creation date analysis
- Examples
- Account creation date analysis using 10,000 retweeters of @Shareblue
- account creation date analysis comparison between two accounts
- Comparison of account creation date analyses across communities using 2,400 retweeters per account
- Bot probability estimates
- Example
- Bot probability analysis using 10,000 retweets of @Shareblue
- Bot probably analysis comparison between two accounts
- Comparison of bot probabilities across communities using 2,400 retweets per account
- Alternate visualizations of bot probabilities
Combined account creation date and bot probability analysis
Conclusions and future directions
Account Creation Dates
Example comparing two accounts
Now lets compare the account creation date distributions of retweeters from two different accounts. Here, I have collected 2400 recent unique retweeters from @dril and @peterdaou to illustrate. Here, the distribution of join dates for @dril is relatively flat, while @peterdaou’s retweeters have strong spikes in their account creation dates around 2009 and January 2017.

Shareblue region
First up are Shareblue affiliated accounts. The Jan ’17 join date spikes can be observed in the retweeter distributions of each account to varying degrees.

Rightwinger region
The join date histograms of the right-wing accounts look totally different than the distributions observed above.

Weird region
Again we see totally different set of similar looking distributions of account created dates of their retweeters. The 2009 spike is the one consistent feature observed on all accounts, while the Jan. ’17 spike is notably absent.

Lefty region
This set of lefty accounts appears more similar to the distributions in the Weird region. The promenade spikes near 2017 on 2-3 of these accounts actually occurred around 6 months prior to Jan ’17.

Podcast region
The largest spike is seen on @aravosis, a conservative democrat. Then @jonfavs followed by @jonlovett also saw the spike but to less of a degree.

Journalist region
Here the largest signal is observed on the founder of Lawfare. Smaller spikes are seen for writers for Vox and Daily Beast.

Publication region
The signal is apparent for Shareblue and PalmerReport. It is difficult to tell how much is there for NYT and ThinkProg.

Resist region
The Jan ’17 spike is incredibly prominent in these big resistance accounts.

TV Region
Liberal television news pundits also display the Jan’ 17 signal, to varying degrees.

Russiagate Region
Again, same signal.

#StillWithHer region
Again we see the signal present for accounts that are establishment democrat defenders.

2020 Presidential region
Here it is clear that the 2017 signal is less apparent on both of Senator Sander’s accounts, however it is strong on the other accounts.

Bot probability estimates
In this section, histograms of bot probabilities are used to examine the distribution of real to fake accounts that retweet each account analyzed. 100 tweets from each retweeter’s timeline were collected and combined with the account-level date in order to provide a probability estimate of each retweeter being a bot.
Example data output after classification:
Example comparing two accounts
Now lets compare bot probability estimate distributions of retweeters from two different accounts. I have collected 2400 unique retweeters from @dril and @peterdaou, then 100 tweets from each retweeter’s timeline, and finally classified each retweeter.
We can see that dril’s retweeters are skewed left (less likely to be bots) with a large peak. The distribution is U-shaped, with a smaller peak of about 100 accounts that are highly likely to be automated. The opposite is true in Peter Daou’s case, with the peak of probability estimates around 90%.

The most important outcome variable is the shape of the probability distribution. If it is a perfect U shape with steep peaks, then the account in question is likely retweeted by a mix of obvious humans and bots. Left skew indicates that there are more retweeters classified as human than bots. Right skew indicates that retweets are more likely automated. If the distribution is flat or convex, this would indicate a deeper issue with the classifier itself. If it is performing properly, there should be either U-shape or skewed distributions of probability estimates.
In the following analyses, 2400 retweets and retweeter user/tweet data was collected to produce probability estimate distributions for the account being analyzed. For tweet-level data collection, 100 recent tweets from each retweeter’s timeline were obtained through the API.
Shareblue region
Shareblue employees and affiliates had similarly skewed-right distributions, indicating that their retweeters are more likely to be be automated accounts.

Rightwinger Region
Here we see more U shaped distributions, but each distribution also skews-right to varying degrees.

Weird region
This region of accounts appears to have a the least amount of automated retweets, indicated by the skewed left and U-shape distributions.

Lefty region
These mostly U-shaped distributions indicate a mix of real and automated retweeters.
Podcast region
Podcaster accounts very greatly in their bot probability distributions. Two accounts skew-right while the others are mostly U-shape or skew-left.
Journalist region
Here we see a large mix of distribution shapes. @ebruenig was the most skewed-left distribution of all accounts analyzed.
Publication region
Here we have another mix of distributions. Shareblue and Palmer skew heavily right, indicating artificial boosting. The other 3 besides Jacobin skew-right but still have clear U-shapes. Jacobin is the one one to skew left.
Resist region
These distributions look similar to those in the Shareblue region, with heavy right-skew.

TV Region
These distributions are highly skewed-right, but each also has a slight U-shape. This indicates a contingent of real retweeters among many automated ones.

RussiaGate region
These distributions look much like Shareblue, and Resist regions, with hard right-skew. However most distributions also have a mode towards 0%, similar to the TV region distributions.

#StillWithHer
More of the same looking distributions as the resist region. Skewed-right by varying degree.

2020 Presidential region
This set is interesting, all except for @BernieSanders and @SenSanders have a decent right-skew. Sanders accounts have a right skew, but also have more of a U-shape.

Visualizing it all together
2020 Presidential region only
Looking at separate histograms across different twitter regions is tough to interpret. The density ridgeline plot allows for multiple distributions to be viewed in the a space similar in size to a single histogram.
Here is the density ridge plot of the same data from the previous set of 2020 presidential region histograms. The added color, representing density, aids visual comprehension of peaks and modes. The uppermost distribution has the lowest mean retweeter bot probability distribution, and the lowermost distribution always has the greatest mean bot probability.

All regions, seperate
Here all regions are grouped and displayed in the same plot. The overall skew of the groups as well as individual distributions are easily interpreted.

All regions, combined
Here the density ridgelines are stacked which allows for quicker comparisons between accounts in different regions.

Combined Join Date and Bot Probability Analysis
The spikes in retweeters with join dates in January of 2017 are suspicious. A really strong signal seems to be primarily present on “Resistance” and mainstream establishment Democrat accounts. To see whether the accounts with Jan 2017 join dates are more likely to be classified as bots, we will first combine the bot probability data sets that have the 2017 signature:
- Shareblue, Resist, Trump-Russia, and #StillWithHer accounts
- Aravosis & jonfavs from podcast region
- Ben Wittles from writing
- PalmerReport and Shareblue from publications
- Kamala Harris, Joe Kennedy, Sen Warren and Joe Biden
Scatter plot of all #Resistance accounts
A scatter plot with very low alpha on the points gives an idea of where accounts are concentrated in terms of join date and bot probability.

Heat maps
#Resistance accounts, combined
Visualizing the data using a heat map helps to visualize when bot accounts were created. Many bot accounts were created during 2009. 2009 was the most frequently observed account creation year, and it also had the greatest number of real accounts. Interestingly, a high concentration of bot accounts that have early 2017 join dates was also observed.

#Resistance accounts, seperate
To see how uniform the bot creation dates are across accounts we can plot the same visualization for each account that was retweeted.

Density plots
The above heat maps are similar to histograms in that they use bins to split up the data.
The plot below uses the 2d density to map the color fill value to. This smoothed visualization makes it easier to compare densities of account creation dates and bot probabilities across accounts.
#Resistance accounts, combined

#Resistance accounts, seperate
The strongest signal is observed on Maddow’s account.

Comparison of TV with other regions
Now, lets compare accounts in the TV region with the lefty and weird regions.

2020 Presidential region
Finally, lets compare the presidential hopefuls. It looks like Kamala Harris has the most 2017 retweet bots of these accounts, followed by Joe Kennedy and Joe Biden. Neither of Bernie Sanders’ accounts are boosted by automated retweet bots to the degree that Kamala Harris or Joe Kennedy are.

Follower analysis
I have also observed accounts created around January 2017 that have been following, in addition to retweeting, the accounts in question. For example, @KamalaHarris has been receiving follows from accounts created in Jan ’17 since shortly after the senator’s account was created. It appears that these bot follows are engineered to provide a sustained flow of new followers to the account over a long period of time. This is evidenced by the horizontal cluster of follows created around Jan’17. Adding new bot follows to an account at a slow and sustained pace accomplishes a few things, 1) people don’t get suspicious when an account gains 100k followers overnight, 2) no burst of followers means that the “crust at the top” due to the “join and follow” phenomena described in the NYT article remains unbroken (purchasing followers in bulk often breaks the continuity of the dark crust at the top of the plot), and 3) sustaining the flow of new followers likely helps to keep an account trending for longer than it would have otherwise so the account shows up in suggested follows, etc.

Conclusion
It is clear from the above analyses that there are automated retweet bots that boost those who are in and/or defend the establishment Democrat party.
These amplifier accounts don’t retweet from third-party clients (like Sally Albright was doing) so their existence must be confirmed statistically– they are invisible to a single API call to get the source client. They appear to use (or emulate) android, iPhone, and web client source clients at about equal rates. Further, the accounts do not have reverse-image searchable profile pictures– they are typically pictures of pets, logos, or obscured faces.
The scope of this AstroTurf operation is vast. Creation of an automated account network this advanced likely involved a massive technical and financial undertaking.
Future directions
Next steps are to:
- Get a better idea for the scope of the bot net
- How big is it?
- Is it still growing?
- Reverse engineer how the network operates
- Track down the watcher bots and the amplifiers
- Are they idle waiting to get activated, or posting constantly?
- Narrow down the Jan’17 accounts that are likely bots
- Confirm that they are using time mapping analyses.
- Use this to develop a more direct way of identifying bots in the network
LS0tDQp0aXRsZTogIkF1dG9tYXRpb24gYW5kIGZha2UgYWNjb3VudHMgYWNyb3NzIFR3aXR0ZXIgY29tbXVuaXRpZXMiDQphdXRob3I6ICJAbGlraW5nb25saW5lIg0Kc3VidGl0bGU6ICdBbmFseXNpcyBvZiByZXR3ZWV0ZXIgYWNjb3VudCBjcmVhdGlvbiBkYXRlcyBhbmQgYm90IHByb2JhYmlsaXRpZXMnDQpkYXRlOiAiMDctMTgtMTgiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCg0KLS0tDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydHdlZXQpDQpsaWJyYXJ5KGJvdHJub3QpDQpsaWJyYXJ5KG11bHRpZHBseXIpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KDQojc2F2ZShyZXNpc3Qsc2hhcmVibHVlX3JlZ2lvbixjaHVkLGRvbnV0LG1zbmJjLGxlZnQsIHJ1c3NpYSwgcG9kY2FzdCxqb3Vybm9zLHNhbmRlcnMsIHdlaXJkLCBtZWRpYSwgZmlsZSA9ICJyZWdpb25zX2JvdHMucmRhdGEiKQ0KI3NhdmUoY29tYiwgZmlsZSA9ICJjb21iaW5lZF9yZWdpb25zLnJkYXRhIikNCg0KbG9hZCgiY29tYmluZWRfcmVnaW9ucy5yZGF0YSIpDQpsb2FkKCIuL2JvdHJub3RfZGF0YS9zaGFyZWJsdWVfcnRfYm5fMTAwMDAucmRhdGEiKQ0KbG9hZCgicmVnaW9uc19ib3RzLnJkYXRhIikNCmxvYWQoImRyaWxkb3UiKQ0KDQpyZXNpc3RhbmNlPC1yYmluZChkb251dCxydXNzaWEsbXNuYmMscmVzaXN0LHNoYXJlYmx1ZV9yZWdpb24pDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OX0NCg0KcGxvdF9ib3Rwcm9iX3JpZGdlczwtZnVuY3Rpb24oLi4uLCBmaWxsID0gImRlbnMiLCBhbHBoYSA9IDEsIHNjYWxlID0gMiwgb3B0aW9uID0gIkQiKXsNCiAgICBkZjwtcmJpbmQoLi4uKSU+JQ0KICAgIGdyb3VwX2J5KHJldHdlZXRfc2NyZWVuX25hbWUpJT4lDQogICAgbXV0YXRlKG1lYW5fcGI9KHByb2JfYm90KSklPiUNCiAgICBhcnJhbmdlKGRlc2MobWVhbl9wYikpDQogIGlmKGZpbGwgPT0gImRlbnMiKXsNCiAgZyA8LSBkZiAlPiUgZ2dwbG90KGFlcyh4PXByb2JfYm90LCB5ID0gcmVvcmRlcihyZXR3ZWV0X3NjcmVlbl9uYW1lLCAtbWVhbl9wYiksIGZpbGwgPSAuLmRlbnNpdHkuLikpDQogICAgICBnIDwtIGcgKyBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gc2NhbGUsIHNob3cubGVnZW5kID0gRikrDQogICAgICAgIHNjYWxlX2ZpbGxfdmlyaWRpcygpDQoNCiAgICB9IGVsc2Ugew0KICAgICAgICBnPC1kZiU+JWdncGxvdChhZXMocHJvYl9ib3QpKQ0KICAgICAgZzwtZytnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gc2NhbGUsIGZpbGwgPSBmaWxsLCAgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKSsNCiAgICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKCkNCg0KICAgIH0NCiAgZyArIHNjYWxlX3hfcGVyY2VudChicmVha3MgPSBjKDAsLjI1LC41MCwuNzUsMSkpKw0KICAgIGxhYnMoeCA9ICJCb3QgUHJvYmFiaWxpdHkiLCB5ID0gIkNvdW50IikrDQogICAgdGhlbWVfaXBzdW0oInNhbnMiLCBncmlkID0gIlgiKQ0KfQ0KDQpwbG90X2JvdHByb2JfaGlzdDwtZnVuY3Rpb24oLi4uLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLCBhbHBoYSA9IDEsIGJpbnMgPSA1MCl7DQogICAgZGY8LXJiaW5kKC4uLiklPiUNCiAgICBncm91cF9ieShyZXR3ZWV0X3NjcmVlbl9uYW1lKSU+JQ0KICAgIG11dGF0ZShtZWFuX3BiPShwcm9iX2JvdCkpJT4lDQogICAgYXJyYW5nZShkZXNjKG1lYW5fcGIpKQ0KICBpZihjb2xvciA9PSAicmV0d2VldGVkIil7DQogIGcgPC0gZGYgJT4lIGdncGxvdChhZXMocHJvYl9ib3QpKQ0KICAgICAgZyA8LSBnICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGNvbG9yID0gcmV0d2VldF9zY3JlZW5fbmFtZSksIGJpbnMgPSBiaW5zLCBmaWxsID0gZmlsbCwgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKSsNCiAgICAgICAgICAgIGZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpKw0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX2lwc3VtKCkNCg0KICAgIH0gZWxzZSB7DQogICAgICAgIGc8LWRmJT4lZ2dwbG90KGFlcyhwcm9iX2JvdCkpDQogICAgICBnPC1nK2dlb21faGlzdG9ncmFtKGNvbG9yID0gY29sb3IsIGZpbGwgPSBmaWxsLCBiaW5zID0gYmlucywgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKQ0KDQogICAgfQ0KICBnICsgc2NhbGVfeF9wZXJjZW50KGJyZWFrcyA9IGMoMCwuMjUsLjUwLC43NSwxKSkrDQogICAgbGFicyh4ID0gIkJvdCBQcm9iYWJpbGl0eSIsIHkgPSAiQ291bnQiKSsNCiAgICB0aGVtZV9pcHN1bSgic2FucyIsIGdyaWQgPSAiWSIpDQp9DQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnBsb3RfY3JlYXRlZF9hdF9oaXN0PC1mdW5jdGlvbiguLi4sIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsIGFscGhhID0gMSwgYmlucyA9IDEwMCl7DQogIGRmPC1yYmluZCguLi4pDQogIGlmKGNvbG9yID09ICJyZXR3ZWV0ZWQiKXsNCiAgICAgIGcgPC0gZGYlPiUgZ2dwbG90KGFlcyhhY2NvdW50X2NyZWF0ZWRfYXQpKQ0KICAgICAgZyA8LSBnICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGNvbG9yID0gcmV0d2VldF9zY3JlZW5fbmFtZSksIGJpbnMgPSBiaW5zLCBmaWxsID0gZmlsbCwgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKSsNCiAgICBmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKSsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX2lwc3VtKCkNCg0KICAgIH0gZWxzZSB7DQogICAgICBnPC1kZiU+JWdncGxvdChhZXMoYWNjb3VudF9jcmVhdGVkX2F0KSkNCiAgICAgIGc8LWcrZ2VvbV9oaXN0b2dyYW0oYmlucyA9IGJpbnMsIGZpbGwgPSBmaWxsLCBjb2xvciA9IGNvbG9yLCBhbHBoYSA9IGFscGhhLCBzaG93LmxlZ2VuZCA9IEYpDQogICAgfQ0KICBnICsgDQogICAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKSsNCiAgICBsYWJzKHggPSAiQWNjb3VudCBDcmVhdGVkIiwgeSA9ICJDb3VudCIpKw0KICAgIHRoZW1lX2lwc3VtKCJzYW5zIiwgZ3JpZCA9ICJZIikNCn0NCmBgYA0KDQpgYGB7ciBldmFsPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05LCBpbmNsdWRlPUZBTFNFfQ0KDQpyZXNpc3Q8LXJiaW5kKEVkS3Jhc3NlbiwgDQogICAgICAgICAgICAgIFNvY2lhbFBvd2VyT25lMSwNCiAgICAgICAgICAgICAgZnVuZGVyLCANCiAgICAgICAgICAgICAga3Jhc3NlbnN0ZWluLA0KICAgICAgICAgICAgICB3aWxsaWFtbGVnYXRlLA0KICAgICAgICAgICAgICBtY3Nwb2NreQ0KICAgICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJSZXNpc3QiKQ0KDQpzaGFyZWJsdWVfcmVnaW9uPC1yYmluZChlcmljYm9laGxlcnQsDQogICAgICAgICAgICAgICAgIG93aWxsaXMsDQogICAgICAgICAgICAgICAgIGZhd2Z1bGZhbiwNCiAgICAgICAgICAgICAgICAgUlZBd29uaywNCiAgICAgICAgICAgICAgICAgcGV0ZXJkYW91LA0KICAgICAgICAgICAgICAgICB0b213YXRzb24NCiAgICAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiU2hhcmVibHVlIikNCg0KZG9udXQ8LXJiaW5kKE1yRGFuZTE5ODIsDQogICAgICAgICAgICAgQnJhdmVuYWtCbG9nLA0KICAgICAgICAgICAgIEFkYW1QYXJraG9tZW5rbywNCiAgICAgICAgICAgIFBoaWxpcHBlUmVpbmVzLA0KICAgICAgICAgICAgSG9hcnNlV2lzcGVyZXIsIA0KICAgICAgICAgICAgbmVlcmF0YW5kZW4NCiAgICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJTdGlsbFdpdGhIZXIiKQ0KDQpjYXA8LXJiaW5kKENBUEFjdGlvbiwNCiAgICAgICAgICAgbmVlcmF0YW5kZW4sDQogICAgICAgICAgIFRvcGhlclNwaXJvLA0KICAgICAgICAgICBKdWRkTGVndW0NCiAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiQ0FQIikNCg0Kd2VpcmQ8LXJiaW5kKGRyaWwsIA0KICAgICAgICAgICAgSW50ZXJuZXRIaXBwbywgDQogICAgICAgICAgICBLcmFuZ1ROZWxzb24sDQogICAgICAgICAgICBwaXhlbGF0ZWRib2F0LA0KICAgICAgICAgICAgQkFLS09PT05OLA0KICAgICAgICAgICAgZmFydA0KICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiV2VpcmQiKQ0KDQpsZWZ0PC1yYmluZChicmllYnJpZWpveSwNCiAgICAgICAgICAgIGJvdXJnZW9pc2FsaWVuLA0KICAgICAgICAgICAgaGlzdG9yeWluZmxpY2tzLA0KICAgICAgICAgICAgY3J1c2hpbmdib3J0LA0KICAgICAgICAgICAgY2xhc3NpY2xpYjNyYWwsDQogICAgICAgICAgICBqaW1teV9kb3JlDQogICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJMZWZ0eSIpDQoNCmpvdXJub3M8LXJiaW5kKA0KICAgICAgICAgICAgZWJydWVuaWcsDQogICAgICAgICAgICBhZGFtam9obnNvbk5ZQywNCiAgICAgICAgICAgIGtlbmtsaXBwZW5zdGVpbiwNCiAgICAgICAgICAgIGV6cmFrbGVpbiwNCiAgICAgICAgICAgIGJlbmphbWlud2l0dGVzLA0KICAgICAgICAgICAgZ2dyZWVud2FsZA0KICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiV3JpdGVycyIpDQoNCg0Kc2FuZGVyczwtcmJpbmQoU2VuU2FuZGVycywNCiAgICAgICAgICAgICAgIEJlcm5pZVNhbmRlcnMsDQogICAgICAgICAgICAgICBTZW5XYXJyZW4sDQogICAgICAgICAgICAgICBLYW1hbGFIYXJyaXMsDQogICAgICAgICAgICAgICBKb2VCaWRlbiwNCiAgICAgICAgICAgICAgIFJlcEpvZUtlbm5lZHkNCiAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiMjAyMCIpDQoNCmNodWQ8LXJiaW5kKGNoYXJsaWVraXJrMTEsIA0KICAgICAgICAgICAgQ2Vybm92aWNoLA0KICAgICAgICAgICAgSmFja1Bvc29iaWVjLA0KICAgICAgICAgICAgUHJpc29uUGxhbmV0LA0KICAgICAgICAgICAgam9yZGFuYnBldGVyc29uLA0KICAgICAgICAgICAgZ2V0b25nYWINCiAgICAgICAgICAgICklPiVtdXRhdGUoUmVnaW9uID0gIlJpZ2h0V2luZ2VycyIpDQoNCm1zbmJjPC1yYmluZChjaHJpc2xoYXllcywNCiAgICAgICAgICAgICBtYWRkb3csDQogICAgICAgICAgICAga3lsZWdyaWZmaW4xLA0KICAgICAgICAgICAgIEpveUFublJlaWQsDQogICAgICAgICAgICAgamFrZXRhcHBlciwNCiAgICAgICAgICAgICBhbmFuYXZhcnJvDQogICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiVFYiKQ0KDQpydXNzaWE8LXJiaW5kKE1hbGNvbG1OYW5jZSwNCiAgICAgICAgICAgICAgdHJpYmVsYXcsDQogICAgICAgICAgICAgIGVyaWNnYXJsYW5kLA0KICAgICAgICAgICAgICBTZXRoQWJyYW1zb24sDQogICAgICAgICAgICAgIEJpbGxLcmlzdG9sLA0KICAgICAgICAgICAgICB0MjBjb21taXR0ZWUNCiAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiUnVzc2lhR2F0ZSIpDQoNCm1lZGlhPC1yYmluZCh0aGVpbnRlcmNlcHQsDQogICAgICAgICAgICAgbnl0aW1lcywNCiAgICAgICAgICAgICBQYWxtZXJSZXBvcnQsDQogICAgICAgICAgICAgamFjb2Jpbm1hZywNCiAgICAgICAgICAgICB0aGlua3Byb2dyZXNzLA0KICAgICAgICAgICAgIHNoYXJlYmx1ZTI0MDANCiAgICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJQdWJsaWNhdGlvbnMiKQ0KDQpwb2RjYXN0PC1yYmluZChCeVlvdXJMb2dpYywNCiAgICAgICAgICAgICAgIGJvcmluZ19hc19oZWNrLA0KICAgICAgICAgICAgICAgam9ubG92ZXR0LA0KICAgICAgICAgICAgICAgam9uZmF2cywNCiAgICAgICAgICAgICAgIGFyYXZvc2lzLA0KICAgICAgICAgICAgICAgTWF0dEJpbmRlcg0KICAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiUG9kY2FzdCIpDQoNCg0KI3NhdmUoZHJpbCwgcGV0ZXJkYW91LCBmaWxlID0iZHJpbGRvdSIpDQpjb21iPC1yYmluZChyZXNpc3Qsc2hhcmVibHVlX3JlZ2lvbixjaHVkLGRvbnV0LG1zbmJjLGxlZnQsIHJ1c3NpYSwgcG9kY2FzdCxqb3Vybm9zLHNhbmRlcnMsIHdlaXJkLCBtZWRpYSkjLCBmaWxlID0gInJlZ2lvbnNfYm90cy5yZGF0YSIpDQoNCmBgYA0KDQojIEludHJvIGFuZCBNZXRob2RzDQoNCkluIHRoaXMgYW5hbHlzaXMgSSBkZW1vbnN0cmF0ZSB0aGUgZXhpc3RlbmNlIG9mIGEgbmV0d29yayBvZiBhdXRvbWF0ZWQgcmV0d2VldCBib3RzIHRoYXQgYW1wbGlmeSBhIGxhcmdlIHNldCBvZiBlc3RhYmxpc2htZW50IERlbW9jcmF0cyBhbmQgbWVtYmVycyBvZiAiUmVzaXN0YW5jZSBUd2l0dGVyIi4gRm9yIGRhdGEgY29sbGVjdGlvbiwgSSB1c2VkIHRoZSBUd2l0dGVyIFNlYXJjaCBBUEkgdmlhIHRoZSBbcnR3ZWV0XShodHRwOi8vcnR3ZWV0LmluZm8vKSByIHBhY2thZ2UgdG8gb2J0YWluIHJldHdlZXRlcnMgb2YgdmFyaW91cyBhY2NvdW50cyBpbiBkaWZmZXJlbnQgY29tbXVuaXRpZXMuIA0KDQpUd28gcHJpbWFyeSBhbmFseXNlcyB3ZXJlIHVzZWQgdG8gZXhhbWluZSB0aGUgcmV0d2VldGVyIGRhdGEgc2V0cyBmb3IgZWFjaCBhY2NvdW50LCB0aGUgZmlyc3QgYmVpbmcgYWNjb3VudCBjcmVhdGlvbiBkYXRlIGRpc3RyaWJ1dGlvbnMuIFdoZW4gYW5hbHl6aW5nIGZvbGxvd2VycyBvciByZXR3ZWV0ZXJzIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zLCB0aGUgZGF0ZSBhbiBhY2NvdW50IGlzIGNyZWF0ZWQgaXMgYSB1c2VmdWwgZmVhdHVyZSB0byBsb29rIGF0IGJlY2F1c2UgaXQgaXMgaW1tdXRhYmxlLiBBIHVzZXIncyBhY2NvdW50IGNyZWF0aW9uIGRhdGUgKGkuZS4gd2hlbiB0aGV5IGpvaW5lZCB0d2l0dGVyKSBjYW5ub3QgYmUgY2hhbmdlZCBieSB0aGUgYWNjb3VudCBvd25lciwgc28gaXQgaXMgdXNlZnVsIGZvciBvYnNlcnZpbmcgaW50ZXJlc3RpbmcgcGF0dGVybnMgYXNzb2NpYXRlZCB3aXRoIGNsdXN0ZXJzIG9mIGFjY291bnRzIGNyZWF0ZWQgd2l0aGluIHNob3J0IHRpbWUgc3BhbnMuIEkgcmVjb21tZW5kIHRoZSBOWSBUaW1lcyBbRm9sbG93ZXIgRmFjdG9yeV0oaHR0cHM6Ly93d3cubnl0aW1lcy5jb20vaW50ZXJhY3RpdmUvMjAxOC8wMS8yNy90ZWNobm9sb2d5L3NvY2lhbC1tZWRpYS1ib3RzLmh0bWwpIGFydGljbGUgZm9yIHJlbGV2YW50IGJhY2tncm91bmQgcmVnYXJkaW5nIGhvdyBhY2NvdW50IGNyZWF0aW9uIGRhdGUgcGF0dGVybnMgY2FuIHJldmVhbCBmYWtlLCBvZnRlbiBwdXJjaGFzZWQsIGJvdCBmb2xsb3dlcnMuIEluIGNvbnRyYXN0IHRvIHRoZSBOWSBUaW1lcyBhcnRpY2xlLCB0aGlzIGFuYWx5c2lzIGZvY3VzZXMgb24gdGhlIGFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgdXNlcnMgdGhhdCByZXR3ZWV0IHBhcnRpY3VsYXIgYWNjb3VudHMsIHJhdGhlciB0aGFuIGZvbGxvd2Vycy4gDQoNClRoZSBzZWNvbmQgYW5hbHlzaXMsIHVzaW5nIGEgbWFjaGluZSBsZWFybmluZyBjbGFzc2lmaWNhdGlvbiB0ZWNobmlxdWUsIHdhcyBhIHByb2JhYmlsaXR5IGVzdGltYXRlIG9mIGFuIGFjY291bnQgYmVpbmcgYSBib3QuIEZvciB0aGlzLCBJIHVzZWQgdGhlIFt0d2VldGJvdG9ybm90XShodHRwczovL2dpdGh1Yi5jb20vbWtlYXJuZXkvdHdlZXRib3Rvcm5vdCkgciBwYWNrYWdlIHRvIGVzdGltYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBlYWNoIHJldHdlZXRlciBiZWluZyBhbiBhdXRvbWF0ZWQgYWNjb3VudC4gQXMgaW4gdGhlIGFjY291bnQgY3JlYXRpb24gZGF0ZSBhbmFseXNpcywgZGlzdHJpYnV0aW9ucyBvZiBib3QgcHJvYmFiaWxpdGllcyB3ZXJlIHZpc3VhbGl6ZWQgdG8gZXhhbWluZSBhIGxhcmdlIG51bWJlciBvZiBhY2NvdW50cyBhdCBvbmNlLiBUaGUgZmFzdCB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0gY2FuIGJlIHRlc3RlZCBbaGVyZV0oaHR0cHM6Ly9taWtld2suc2hpbnlhcHBzLmlvL2JvdG9ybm90Lykgb24gc2luZ2xlIGFjY291bnRzIHVzaW5nIGFjY291bnQtbGV2ZWwgKGJpbywgdHdlZXQgdm9sdW1lLCBmb2xsb3dlciBhbmQgZnJpZW5kIGNvdW50LCBldGMuKSBkYXRhIG9ubHkuIFRvIG9idGFpbiBhIG1vcmUgYWNjdXJhdGUgZXN0aW1hdGUgb2Ygd2hldGhlciBhbiBhY2NvdW50IGlzIGEgYm90IG9yIG5vdCwgdHdlZXQtbGV2ZWwgKGNhcGl0YWxpemF0aW9uLCBoYXNodGFnIHVzZSwgbWVudGlvbnMsIGV0Yy4pIGRhdGEgd2FzIHVzZWQgaW4gYWRkaXRpb24gdG8gdGhlIGFjY291bnQtbGV2ZWwgZGF0YS4gSW4gdGhlIGZvbGxvd2luZyBhbmFseXNpcywgdHdlZXQtbGV2ZWwgZGF0YSBjb25zaXN0ZWQgb2YgcmV0d2VldGVyJ3MgbW9zdCByZWNlbnQgMTAwIHR3ZWV0cy4gVGhlIGdyYWRpZW50IGJvb3N0ZWQgbW9kZWwgKHVzaW5nIHRoZSBbZ2JtXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2JtL2luZGV4Lmh0bWwpIHBhY2thZ2UpIHVzZWQgdGhlIGNvbWJpbmF0aW9uIG9mIGFjY291bnQgYW5kIHR3ZWV0LWxldmVsIGRhdGEgdG8gZXN0aW1hdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgZWFjaCByZXR3ZWV0aW5nIGFjY291bnQgaXMgYSBib3QuDQoNClRoZSBwcm9jZWVkaW5nIHNlY3Rpb25zIGFyZSBvcmdhbml6ZWQgYXMgc3VjaDoNCg0KMS4gIERhdGEgY29sbGVjdGlvbiBtZXRob2RvbG9neQ0KDQoyLiAgQWNjb3VudCBjcmVhdGlvbiBkYXRlIGFuYWx5c2lzDQogICAgKyBFeGFtcGxlcw0KICAgICAgKyBBY2NvdW50IGNyZWF0aW9uIGRhdGUgYW5hbHlzaXMgdXNpbmcgMTAsMDAwIHJldHdlZXRlcnMgb2YgQFNoYXJlYmx1ZQ0KICAgICAgKyBhY2NvdW50IGNyZWF0aW9uIGRhdGUgYW5hbHlzaXMgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBhY2NvdW50cw0KICAgICsgQ29tcGFyaXNvbiBvZiBhY2NvdW50IGNyZWF0aW9uIGRhdGUgYW5hbHlzZXMgYWNyb3NzIGNvbW11bml0aWVzIHVzaW5nIDIsNDAwIHJldHdlZXRlcnMgcGVyIGFjY291bnQNCg0KMy4gIEJvdCBwcm9iYWJpbGl0eSBlc3RpbWF0ZXMNCiAgICArIEV4YW1wbGUgDQogICAgICArIEJvdCBwcm9iYWJpbGl0eSBhbmFseXNpcyB1c2luZyAxMCwwMDAgcmV0d2VldHMgb2YgQFNoYXJlYmx1ZQ0KICAgICAgKyBCb3QgcHJvYmFibHkgYW5hbHlzaXMgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBhY2NvdW50cw0KICAgICsgQ29tcGFyaXNvbiBvZiBib3QgcHJvYmFiaWxpdGllcyBhY3Jvc3MgY29tbXVuaXRpZXMgdXNpbmcgMiw0MDAgcmV0d2VldHMgcGVyIGFjY291bnQNCiAgICArIEFsdGVybmF0ZSB2aXN1YWxpemF0aW9ucyBvZiBib3QgcHJvYmFiaWxpdGllcw0KDQo0LiAgQ29tYmluZWQgYWNjb3VudCBjcmVhdGlvbiBkYXRlIGFuZCBib3QgcHJvYmFiaWxpdHkgYW5hbHlzaXMNCg0KNS4gIENvbmNsdXNpb25zIGFuZCBmdXR1cmUgZGlyZWN0aW9ucw0KICAgIA0KIyBSZXR3ZWV0ZXIgZGF0YSBjb2xsZWN0aW9uDQoNClRvIG9idGFpbiBvbmx5IHJldHdlZXRzIG9mIGFuIHNwZWNpZmljIGFjY291bnQgKGkuZS4gQFNoYXJlYmx1ZSkgZnJvbSB0aGUgU2VhcmNoIEFQSSwgbWVudGlvbnMgYW5kIG9yaWdpbmFsIHR3ZWV0cyB3ZXJlIGRpc2NhcmRlZCBieSBmaWx0ZXJpbmcgb3V0IGFsbCB0d2VldHMgdGhhdCBkaWQgbm90IGhhdmUgIlNoYXJlYmx1ZSIgaW4gdGhlIHJldHdlZXRfc2NyZWVuX25hbWUgZmllbGQuIFRoaXMgcHJvY2VzcyB3YXMgcmVwZWF0ZWQgdW50aWwgMTAsMDAwIHJlY2VudCByZXR3ZWV0cyB3ZXJlIGdhdGhlcmVkIGZyb20gNSw1ODUgdW5pcXVlIGFjY291bnRzLiBUaGlzIHByb2Nlc3MgcHJvZHVjZWQgYWNjb3VudC1sZXZlbCBkYXRhIHdoaWNoIGluY2x1ZGVzIHRoZSBhY2NvdW50IGNyZWF0aW9uIGRhdGUuIFRvIG9idGFpbiB1bmlxdWUgcmV0d2VldGVycyBvbmx5LCB0aGlzIHByb2Nlc3MgY2FuIGJlIHJlcGVhdGVkIGluIGNvbmp1bmN0aW9uIHdpdGggZmlsdGVyaW5nIHRvIG9idGFpbiBvbmx5IGRpc3RpbmN0IHVzZXIgYWNjb3VudHMuDQoNCg0KIyBBY2NvdW50IENyZWF0aW9uIERhdGVzDQoNCiMjIEV4YW1wbGUgdXNpbmcgU2hhcmVibHVlIHJldHdlZXRlcnMNCg0KQmVsb3cgaXMgYSBoaXN0b2dyYW0gb2YgdGhlIGFjY291bnQgY3JlYXRpb24gZGF0ZXMgZnJvbSB0aGUgMTAsMDAwIHJldHdlZXQgQFNoYXJlYmx1ZSByZXR3ZWV0IGRhdGEgc2V0LiBUaGUgZGF0YSBkaXNwbGF5cyBhY2NvdW50IGNyZWF0aW9uIGRhdGVzIGZyb20gNSw1ODUgdW5pcXVlIHJldHdlZXRlcnMuIE1ha2Ugbm90ZSBvZiB0aGUgbGFyZ2Ugc3Bpa2UgaW4gYWNjb3VudHMgY3JlYXRlZCBhcm91bmQgMjAwOSBhbmQgZWFybHkgMjAxNy4gVGhlIDIwMDkgc3Bpa2UgaXMgdGhvdWdodCB0byBiZSBUd2l0dGVyJ3MgYmFubmVyIHllYXIsIHdoZW4gaXQgcmVhbGx5IGNhdWdodCBvbiBhbmQgZXZlcnlvbmUgbWFkZSBhbmQgYWNjb3VudC4gVGhlc2Ugc3Bpa2VzIGluIGFjY291bnQgY3JlYXRpb24gZGF0ZXMgY2FuIGJlIG9ic2VydmVkIGFyb3VuZCB0aGUgdGltZSBUd2l0dGVyIHdlbnQgbWFpbnN0cmVhbSBvdGhlciBjb3VudHJpZXMuIEJ1dCB3aGF0IGNvdWxkIGV4cGxhaW4gdGhlIGh1Z2Ugc3Bpa2UgaW4gYWNjb3VudCBjcmVhdGlvbnMgYXJvdW5kIEphbnVhcnkgMjAxNyB0aGF0IHJldHdlZXQgU2hhcmVibHVlPyBBbiBvcmdhbmljIGV4cGxhbmF0aW9uIGNvdWxkIGJlIHRoYXQgdGhlc2UgYWNjb3VudHMgd2VyZSBjcmVhdGVkIGJ5IHJlYWwgcGVvcGxlIGFyb3VuZCB0aGUgdGltZSBvZiB0aGUgaW5hdWd1cmF0aW9uIHRvIHJlc2lzdCBUcnVtcCBvbiBUd2l0dGVyLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3Qoc2hhcmVibHVlKStsYWJzKHRpdGxlID0gIlNoYXJlYmx1ZSByZXR3ZWV0ZXIgam9pbiBkYXRlcyIsIGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBmcm9tIDEwLDAwMCByZXR3ZWV0cyBvZiBTaGFyZWJsdWUiKQ0KYGBgDQoNCiMjIEV4YW1wbGUgY29tcGFyaW5nIHR3byBhY2NvdW50cw0KDQpOb3cgbGV0cyBjb21wYXJlIHRoZSBhY2NvdW50IGNyZWF0aW9uIGRhdGUgZGlzdHJpYnV0aW9ucyBvZiByZXR3ZWV0ZXJzIGZyb20gdHdvIGRpZmZlcmVudCBhY2NvdW50cy4gSGVyZSwgSSBoYXZlIGNvbGxlY3RlZCAyNDAwIHJlY2VudCB1bmlxdWUgcmV0d2VldGVycyBmcm9tIEBkcmlsIGFuZCBAcGV0ZXJkYW91IHRvIGlsbHVzdHJhdGUuIEhlcmUsIHRoZSBkaXN0cmlidXRpb24gb2Ygam9pbiBkYXRlcyBmb3IgQGRyaWwgaXMgcmVsYXRpdmVseSBmbGF0LCB3aGlsZSBAcGV0ZXJkYW91J3MgcmV0d2VldGVycyBoYXZlIHN0cm9uZyBzcGlrZXMgaW4gdGhlaXIgYWNjb3VudCBjcmVhdGlvbiBkYXRlcyBhcm91bmQgMjAwOSBhbmQgSmFudWFyeSAyMDE3Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QocGV0ZXJkYW91LCBkcmlsLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKHRpdGxlID0gIlJldHdlZXRlciBhY2NvdW50IGNyZWF0aW9uIGRhdGVzOiBEcmlsIHZzIERhb3UiLCBjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQojIyBDb21wYXJpbmcgYWNjb3VudHMgYWNyb3NzIFR3aXR0ZXIgY29tbXVuaXRpZXMNCg0KVGhlIGZvbGxvd2luZyBzZWN0aW9uIGNvbXBhcmVzIGFjY291bnQgY3JlYXRpb24gZGF0ZSBkaXN0cmlidXRpb25zIHdpdGhpbiB2YXJpb3VzIFR3aXR0ZXIgY29tbXVuaXRpZXMgb3IgcmVnaW9ucy4gQ29tcGFyaW5nIGJldHdlZW4gcmVnaW9ucyBhbGxvd3MgdXMgdG8gZXhhbWluZSBob3cgdGhlIEphbnVhcnkgMjAxNyBwZWFrIGRpZmZlcnMgYmV0d2VlbiBhY2NvdW50cyBhbmQgYWNyb3NzIHJlZ2lvbnMuDQoNCiMjIFNoYXJlYmx1ZSByZWdpb24NCg0KRmlyc3QgdXAgYXJlIFNoYXJlYmx1ZSBhZmZpbGlhdGVkIGFjY291bnRzLiBUaGUgSmFuICcxNyBqb2luIGRhdGUgc3Bpa2VzIGNhbiBiZSBvYnNlcnZlZCBpbiB0aGUgcmV0d2VldGVyIGRpc3RyaWJ1dGlvbnMgb2YgZWFjaCBhY2NvdW50IHRvIHZhcnlpbmcgZGVncmVlcy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChzaGFyZWJsdWVfcmVnaW9uLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwIHJldHdlZXRlcnMiKQ0KYGBgDQoNCiMjIFJpZ2h0d2luZ2VyIHJlZ2lvbg0KDQpUaGUgam9pbiBkYXRlIGhpc3RvZ3JhbXMgb2YgdGhlIHJpZ2h0LXdpbmcgYWNjb3VudHMgbG9vayB0b3RhbGx5IGRpZmZlcmVudCB0aGFuIHRoZSBkaXN0cmlidXRpb25zIG9ic2VydmVkIGFib3ZlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QoY2h1ZCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpDQpgYGANCg0KIyMgV2VpcmQgcmVnaW9uDQoNCkFnYWluIHdlIHNlZSB0b3RhbGx5IGRpZmZlcmVudCBzZXQgb2Ygc2ltaWxhciBsb29raW5nIGRpc3RyaWJ1dGlvbnMgb2YgYWNjb3VudCBjcmVhdGVkIGRhdGVzIG9mIHRoZWlyIHJldHdlZXRlcnMuIFRoZSAyMDA5IHNwaWtlIGlzIHRoZSBvbmUgY29uc2lzdGVudCBmZWF0dXJlIG9ic2VydmVkIG9uIGFsbCBhY2NvdW50cywgd2hpbGUgdGhlIEphbi4gJzE3IHNwaWtlIGlzIG5vdGFibHkgYWJzZW50Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3Qod2VpcmQsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCg0KIyMgTGVmdHkgcmVnaW9uDQoNClRoaXMgc2V0IG9mIGxlZnR5IGFjY291bnRzIGFwcGVhcnMgbW9yZSBzaW1pbGFyIHRvIHRoZSBkaXN0cmlidXRpb25zIGluIHRoZSBXZWlyZCByZWdpb24uIFRoZSBwcm9tZW5hZGUgc3Bpa2VzIG5lYXIgMjAxNyBvbiAyLTMgb2YgdGhlc2UgYWNjb3VudHMgYWN0dWFsbHkgb2NjdXJyZWQgYXJvdW5kIDYgbW9udGhzIHByaW9yIHRvIEphbiAnMTcuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChsZWZ0LCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQojIyBQb2RjYXN0IHJlZ2lvbg0KDQpUaGUgbGFyZ2VzdCBzcGlrZSBpcyBzZWVuIG9uIEBhcmF2b3NpcywgYSBjb25zZXJ2YXRpdmUgZGVtb2NyYXQuIFRoZW4gQGpvbmZhdnMgZm9sbG93ZWQgYnkgQGpvbmxvdmV0dCBhbHNvIHNhdyB0aGUgc3Bpa2UgYnV0IHRvIGxlc3Mgb2YgYSBkZWdyZWUuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChwb2RjYXN0LCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQojIyBKb3VybmFsaXN0IHJlZ2lvbg0KDQpIZXJlIHRoZSBsYXJnZXN0IHNpZ25hbCBpcyBvYnNlcnZlZCBvbiB0aGUgZm91bmRlciBvZiBMYXdmYXJlLiBTbWFsbGVyIHNwaWtlcyBhcmUgc2VlbiBmb3Igd3JpdGVycyBmb3IgVm94IGFuZCBEYWlseSBCZWFzdC4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfY3JlYXRlZF9hdF9oaXN0KGpvdXJub3MsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnModGl0bGUgPSAiV3JpdGluZyBSZWdpb246IFJldHdlZXRlciBhY2NvdW50IGNyZWF0aW9uIGRhdGVzIiwgY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCiMjIFB1YmxpY2F0aW9uIHJlZ2lvbg0KDQpUaGUgc2lnbmFsIGlzIGFwcGFyZW50IGZvciBTaGFyZWJsdWUgYW5kIFBhbG1lclJlcG9ydC4gSXQgaXMgZGlmZmljdWx0IHRvIHRlbGwgaG93IG11Y2ggaXMgdGhlcmUgZm9yIE5ZVCBhbmQgVGhpbmtQcm9nLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QobWVkaWEsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCiMjIFJlc2lzdCByZWdpb24NCg0KVGhlIEphbiAnMTcgc3Bpa2UgaXMgaW5jcmVkaWJseSBwcm9taW5lbnQgaW4gdGhlc2UgYmlnIHJlc2lzdGFuY2UgYWNjb3VudHMuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChyZXNpc3QsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCg0KDQoNCiMjIFRWIFJlZ2lvbg0KDQpMaWJlcmFsIHRlbGV2aXNpb24gbmV3cyBwdW5kaXRzIGFsc28gZGlzcGxheSB0aGUgSmFuJyAxNyBzaWduYWwsIHRvIHZhcnlpbmcgZGVncmVlcy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfY3JlYXRlZF9hdF9oaXN0KG1zbmJjLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQoNCg0KIyMgUnVzc2lhZ2F0ZSBSZWdpb24NCg0KQWdhaW4sIHNhbWUgc2lnbmFsLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QocnVzc2lhLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQojIyAjU3RpbGxXaXRoSGVyIHJlZ2lvbg0KDQpBZ2FpbiB3ZSBzZWUgdGhlIHNpZ25hbCBwcmVzZW50IGZvciBhY2NvdW50cyB0aGF0IGFyZSBlc3RhYmxpc2htZW50IGRlbW9jcmF0IGRlZmVuZGVycy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChkb251dCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpDQpgYGANCg0KDQojIyAyMDIwIFByZXNpZGVudGlhbCByZWdpb24NCg0KSGVyZSBpdCBpcyBjbGVhciB0aGF0IHRoZSAyMDE3IHNpZ25hbCBpcyBsZXNzIGFwcGFyZW50IG9uIGJvdGggb2YgU2VuYXRvciBTYW5kZXIncyBhY2NvdW50cywgaG93ZXZlciBpdCBpcyBzdHJvbmcgb24gdGhlIG90aGVyIGFjY291bnRzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3Qoc2FuZGVycywgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpDQpgYGANCg0KIyBCb3QgcHJvYmFiaWxpdHkgZXN0aW1hdGVzDQoNCkluIHRoaXMgc2VjdGlvbiwgaGlzdG9ncmFtcyBvZiBib3QgcHJvYmFiaWxpdGllcyBhcmUgdXNlZCB0byBleGFtaW5lIHRoZSBkaXN0cmlidXRpb24gb2YgcmVhbCB0byBmYWtlIGFjY291bnRzIHRoYXQgcmV0d2VldCBlYWNoIGFjY291bnQgYW5hbHl6ZWQuIDEwMCB0d2VldHMgZnJvbSBlYWNoIHJldHdlZXRlcidzIHRpbWVsaW5lIHdlcmUgY29sbGVjdGVkIGFuZCBjb21iaW5lZCB3aXRoIHRoZSBhY2NvdW50LWxldmVsIGRhdGUgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIHByb2JhYmlsaXR5IGVzdGltYXRlIG9mIGVhY2ggcmV0d2VldGVyIGJlaW5nIGEgYm90Lg0KDQojIyMjIEV4YW1wbGUgZGF0YSBvdXRwdXQgYWZ0ZXIgY2xhc3NpZmljYXRpb246DQoNCmBgYHtyIGVjaG89RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9DQpzaGFyZWJsdWUNCmBgYA0KDQojIyBFeGFtcGxlIHVzaW5nIFNoYXJlYmx1ZSByZXR3ZWV0ZXJzDQoNCkJlbG93IGlzIGEgaGlzdG9ncmFtIG9mIHRoZSBlc3RpbWF0ZWQgYm90IHByb2JhYmlsaXRpZXMgb2YgdGhlIDUsNTg1IHVuaXF1ZSBhY2NvdW50cyB0aGF0IHJldHdlZXRlZCBTaGFyZWJsdWUuIA0KDQpUaGUgZGlzdHJpYnV0aW9uIGlzIGhpZ2hseSBza2V3ZWQtcmlnaHQsIGluZGljYXRpbmcgdGhhdCBtYW55IG9mIHRoZXNlIGFjY291bnRzIGFuYWx5emVkIGFyZSBoaWdobHkgbGlrZWx5IHRvIGJlIGF1dG9tYXRlZCBib3RzLg0KDQoNCmBgYGBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2JvdHByb2JfaGlzdChzaGFyZWJsdWUpK2xhYnModGl0bGUgPSAiU2hhcmVibHVlIHJldHdlZXRlciBib3QgcHJvYmFiaWxpdGllcyIsIGNhcHRpb24gPSAiRXN0aW1hdGVkIHByb2JhYmlsaXRpZXMgb2YgNSw1ODUgcmV0d2VldGVycyBiZWluZyBib3RzIikNCmBgYA0KDQoNCiMjIEV4YW1wbGUgY29tcGFyaW5nIHR3byBhY2NvdW50cw0KDQpOb3cgbGV0cyBjb21wYXJlIGJvdCBwcm9iYWJpbGl0eSBlc3RpbWF0ZSBkaXN0cmlidXRpb25zIG9mIHJldHdlZXRlcnMgZnJvbSB0d28gZGlmZmVyZW50IGFjY291bnRzLiBJIGhhdmUgY29sbGVjdGVkIDI0MDAgdW5pcXVlIHJldHdlZXRlcnMgZnJvbSBAZHJpbCBhbmQgQHBldGVyZGFvdSwgdGhlbiAxMDAgdHdlZXRzIGZyb20gZWFjaCByZXR3ZWV0ZXIncyB0aW1lbGluZSwgYW5kIGZpbmFsbHkgY2xhc3NpZmllZCBlYWNoIHJldHdlZXRlci4NCg0KV2UgY2FuIHNlZSB0aGF0IGRyaWwncyByZXR3ZWV0ZXJzIGFyZSBza2V3ZWQgbGVmdCAobGVzcyBsaWtlbHkgdG8gYmUgYm90cykgd2l0aCBhIGxhcmdlIHBlYWsuIFRoZSBkaXN0cmlidXRpb24gaXMgVS1zaGFwZWQsIHdpdGggYSBzbWFsbGVyIHBlYWsgb2YgYWJvdXQgMTAwIGFjY291bnRzIHRoYXQgYXJlIGhpZ2hseSBsaWtlbHkgdG8gYmUgYXV0b21hdGVkLiBUaGUgb3Bwb3NpdGUgaXMgdHJ1ZSBpbiBQZXRlciBEYW91J3MgY2FzZSwgd2l0aCB0aGUgcGVhayBvZiBwcm9iYWJpbGl0eSBlc3RpbWF0ZXMgYXJvdW5kIDkwJS4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHBldGVyZGFvdSwgZHJpbCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyh0aXRsZSA9ICJSZXR3ZWV0ZXIgYm90IHByb2JhYmlsaXRpZXM6IERyaWwgdnMgRGFvdSIsIGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KVGhlIG1vc3QgaW1wb3J0YW50IG91dGNvbWUgdmFyaWFibGUgaXMgdGhlIHNoYXBlIG9mIHRoZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24uIElmIGl0IGlzIGEgcGVyZmVjdCBVIHNoYXBlIHdpdGggc3RlZXAgcGVha3MsIHRoZW4gdGhlIGFjY291bnQgaW4gcXVlc3Rpb24gaXMgbGlrZWx5IHJldHdlZXRlZCBieSBhIG1peCBvZiBvYnZpb3VzIGh1bWFucyBhbmQgYm90cy4gTGVmdCBza2V3IGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBtb3JlIHJldHdlZXRlcnMgY2xhc3NpZmllZCBhcyBodW1hbiB0aGFuIGJvdHMuIFJpZ2h0IHNrZXcgaW5kaWNhdGVzIHRoYXQgcmV0d2VldHMgYXJlIG1vcmUgbGlrZWx5IGF1dG9tYXRlZC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBpcyBmbGF0IG9yIGNvbnZleCwgdGhpcyB3b3VsZCBpbmRpY2F0ZSBhIGRlZXBlciBpc3N1ZSB3aXRoIHRoZSBjbGFzc2lmaWVyIGl0c2VsZi4gSWYgaXQgaXMgcGVyZm9ybWluZyBwcm9wZXJseSwgdGhlcmUgc2hvdWxkIGJlIGVpdGhlciBVLXNoYXBlIG9yIHNrZXdlZCBkaXN0cmlidXRpb25zIG9mIHByb2JhYmlsaXR5IGVzdGltYXRlcy4NCg0KDQpJbiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzLCAyNDAwIHJldHdlZXRzIGFuZCByZXR3ZWV0ZXIgdXNlci90d2VldCBkYXRhIHdhcyBjb2xsZWN0ZWQgdG8gcHJvZHVjZSBwcm9iYWJpbGl0eSBlc3RpbWF0ZSBkaXN0cmlidXRpb25zIGZvciB0aGUgYWNjb3VudCBiZWluZyBhbmFseXplZC4gRm9yIHR3ZWV0LWxldmVsIGRhdGEgY29sbGVjdGlvbiwgMTAwIHJlY2VudCB0d2VldHMgZnJvbSBlYWNoIHJldHdlZXRlcidzIHRpbWVsaW5lIHdlcmUgb2J0YWluZWQgdGhyb3VnaCB0aGUgQVBJLg0KDQojIyBTaGFyZWJsdWUgcmVnaW9uDQoNClNoYXJlYmx1ZSBlbXBsb3llZXMgYW5kIGFmZmlsaWF0ZXMgaGFkIHNpbWlsYXJseSBza2V3ZWQtcmlnaHQgZGlzdHJpYnV0aW9ucywgaW5kaWNhdGluZyB0aGF0IHRoZWlyIHJldHdlZXRlcnMgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGJlIGF1dG9tYXRlZCBhY2NvdW50cy4NCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2JvdHByb2JfaGlzdChzaGFyZWJsdWVfcmVnaW9uLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyMgUmlnaHR3aW5nZXIgUmVnaW9uDQoNCkhlcmUgd2Ugc2VlIG1vcmUgVSBzaGFwZWQgZGlzdHJpYnV0aW9ucywgYnV0IGVhY2ggZGlzdHJpYnV0aW9uIGFsc28gc2tld3MtcmlnaHQgdG8gdmFyeWluZyBkZWdyZWVzLg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KGNodWQsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQojIyBXZWlyZCByZWdpb24NCg0KVGhpcyByZWdpb24gb2YgYWNjb3VudHMgYXBwZWFycyB0byBoYXZlIGEgdGhlIGxlYXN0IGFtb3VudCBvZiBhdXRvbWF0ZWQgcmV0d2VldHMsIGluZGljYXRlZCBieSB0aGUgc2tld2VkIGxlZnQgYW5kIFUtc2hhcGUgZGlzdHJpYnV0aW9ucy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHdlaXJkLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyMgTGVmdHkgcmVnaW9uIA0KDQpUaGVzZSBtb3N0bHkgVS1zaGFwZWQgZGlzdHJpYnV0aW9ucyBpbmRpY2F0ZSBhIG1peCBvZiByZWFsIGFuZCBhdXRvbWF0ZWQgcmV0d2VldGVycy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KGxlZnQsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCg0KYGBgDQoNCiMjIFBvZGNhc3QgcmVnaW9uDQoNClBvZGNhc3RlciBhY2NvdW50cyB2ZXJ5IGdyZWF0bHkgaW4gdGhlaXIgYm90IHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMuIFR3byBhY2NvdW50cyBza2V3LXJpZ2h0IHdoaWxlIHRoZSBvdGhlcnMgYXJlIG1vc3RseSBVLXNoYXBlIG9yIHNrZXctbGVmdC4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHBvZGNhc3QsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQojIyBKb3VybmFsaXN0IHJlZ2lvbg0KDQpIZXJlIHdlIHNlZSBhIGxhcmdlIG1peCBvZiBkaXN0cmlidXRpb24gc2hhcGVzLiBAZWJydWVuaWcgd2FzIHRoZSBtb3N0IHNrZXdlZC1sZWZ0IGRpc3RyaWJ1dGlvbiBvZiBhbGwgYWNjb3VudHMgYW5hbHl6ZWQuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3Qoam91cm5vcyxjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyMgUHVibGljYXRpb24gcmVnaW9uDQoNCkhlcmUgd2UgaGF2ZSBhbm90aGVyIG1peCBvZiBkaXN0cmlidXRpb25zLiBTaGFyZWJsdWUgYW5kIFBhbG1lciBza2V3IGhlYXZpbHkgcmlnaHQsIGluZGljYXRpbmcgYXJ0aWZpY2lhbCBib29zdGluZy4gVGhlIG90aGVyIDMgYmVzaWRlcyBKYWNvYmluIHNrZXctcmlnaHQgYnV0IHN0aWxsIGhhdmUgY2xlYXIgVS1zaGFwZXMuIEphY29iaW4gaXMgdGhlIG9uZSBvbmUgdG8gc2tldyBsZWZ0Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3QobWVkaWEsY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKQ0KYGBgDQoNCiMjIFJlc2lzdCByZWdpb24NCg0KVGhlc2UgZGlzdHJpYnV0aW9ucyBsb29rIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlIFNoYXJlYmx1ZSByZWdpb24sIHdpdGggaGVhdnkgcmlnaHQtc2tldy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHJlc2lzdCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKQ0KYGBgDQoNCiMjIFRWIFJlZ2lvbg0KVGhlc2UgZGlzdHJpYnV0aW9ucyBhcmUgaGlnaGx5IHNrZXdlZC1yaWdodCwgYnV0IGVhY2ggYWxzbyBoYXMgYSBzbGlnaHQgVS1zaGFwZS4gVGhpcyBpbmRpY2F0ZXMgYSBjb250aW5nZW50IG9mIHJlYWwgcmV0d2VldGVycyBhbW9uZyBtYW55IGF1dG9tYXRlZCBvbmVzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3QobXNuYmMsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQoNCg0KIyMgUnVzc2lhR2F0ZSByZWdpb24NCg0KVGhlc2UgZGlzdHJpYnV0aW9ucyBsb29rIG11Y2ggbGlrZSBTaGFyZWJsdWUsIGFuZCBSZXNpc3QgcmVnaW9ucywgd2l0aCBoYXJkIHJpZ2h0LXNrZXcuIEhvd2V2ZXIgbW9zdCBkaXN0cmlidXRpb25zIGFsc28gaGF2ZSBhIG1vZGUgdG93YXJkcyAwJSwgc2ltaWxhciB0byB0aGUgVFYgcmVnaW9uIGRpc3RyaWJ1dGlvbnMuDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3QocnVzc2lhLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQoNCmBgYA0KDQoNCg0KDQoNCiMjICNTdGlsbFdpdGhIZXINCg0KTW9yZSBvZiB0aGUgc2FtZSBsb29raW5nIGRpc3RyaWJ1dGlvbnMgYXMgdGhlIHJlc2lzdCByZWdpb24uIFNrZXdlZC1yaWdodCBieSB2YXJ5aW5nIGRlZ3JlZS4NCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2JvdHByb2JfaGlzdChkb251dCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKQ0KDQpgYGANCg0KIyMgMjAyMCBQcmVzaWRlbnRpYWwgcmVnaW9uDQoNClRoaXMgc2V0IGlzIGludGVyZXN0aW5nLCBhbGwgZXhjZXB0IGZvciBAQmVybmllU2FuZGVycyBhbmQgQFNlblNhbmRlcnMgaGF2ZSBhIGRlY2VudCByaWdodC1za2V3LiBTYW5kZXJzIGFjY291bnRzIGhhdmUgYSByaWdodCBza2V3LCBidXQgYWxzbyBoYXZlIG1vcmUgb2YgYSBVLXNoYXBlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3Qoc2FuZGVycyxjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyBWaXN1YWxpemluZyBpdCBhbGwgdG9nZXRoZXINCiMjIDIwMjAgUHJlc2lkZW50aWFsIHJlZ2lvbiBvbmx5DQpMb29raW5nIGF0IHNlcGFyYXRlIGhpc3RvZ3JhbXMgYWNyb3NzIGRpZmZlcmVudCB0d2l0dGVyIHJlZ2lvbnMgaXMgdG91Z2ggdG8gaW50ZXJwcmV0LiBUaGUgZGVuc2l0eSByaWRnZWxpbmUgcGxvdCBhbGxvd3MgZm9yIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnMgdG8gYmUgdmlld2VkIGluIHRoZSBhIHNwYWNlIHNpbWlsYXIgaW4gc2l6ZSB0byBhIHNpbmdsZSBoaXN0b2dyYW0uIA0KDQpIZXJlIGlzIHRoZSBkZW5zaXR5IHJpZGdlIHBsb3Qgb2YgdGhlIHNhbWUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBzZXQgb2YgMjAyMCBwcmVzaWRlbnRpYWwgcmVnaW9uIGhpc3RvZ3JhbXMuIFRoZSBhZGRlZCBjb2xvciwgcmVwcmVzZW50aW5nIGRlbnNpdHksIGFpZHMgdmlzdWFsIGNvbXByZWhlbnNpb24gb2YgcGVha3MgYW5kIG1vZGVzLiBUaGUgdXBwZXJtb3N0IGRpc3RyaWJ1dGlvbiBoYXMgdGhlIGxvd2VzdCBtZWFuIHJldHdlZXRlciBib3QgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uLCBhbmQgdGhlIGxvd2VybW9zdCBkaXN0cmlidXRpb24gYWx3YXlzIGhhcyB0aGUgZ3JlYXRlc3QgbWVhbiBib3QgcHJvYmFiaWxpdHkuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90X2JvdHByb2JfcmlkZ2VzKHNhbmRlcnMpDQpgYGANCg0KIyMgQWxsIHJlZ2lvbnMsIHNlcGVyYXRlDQoNCkhlcmUgYWxsIHJlZ2lvbnMgYXJlIGdyb3VwZWQgYW5kIGRpc3BsYXllZCBpbiB0aGUgc2FtZSBwbG90LiBUaGUgb3ZlcmFsbCBza2V3IG9mIHRoZSBncm91cHMgYXMgd2VsbCBhcyBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGVhc2lseSBpbnRlcnByZXRlZC4gIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb21iJT4lcGxvdF9ib3Rwcm9iX3JpZGdlcyhmaWxsID0gImRlbnMiLCBzY2FsZT0gMiwgb3B0aW9uID0gIkQiKStmYWNldF93cmFwKH5SZWdpb24sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykrbGFicyh0aXRsZT0gIlJldHdlZXQgYXV0b21hdGlvbiBhbmQgYm90IHVzZSBhY3Jvc3MgZGlmZmVyZW50IHJlZ2lvbnMgb2YgVHdpdHRlciIsIHN1YnRpdGxlPSJZZWxsb3cgcGVha3MgZnVydGhlciB0byB0aGUgcmlnaHQgaW5kaWNhdGUgYSBncmVhdGVyIHByb3BvcnRpb24gb2YgcmV0d2VldHMgcmVjZWl2ZWQgd2VyZSBhdXRvbWF0ZWQiLCBjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgcmVjZW50IHJldHdlZXRlcnMgcGVyIGFjY291bnQiKQ0KYGBgDQoNCiMjIEFsbCByZWdpb25zLCBjb21iaW5lZCANCkhlcmUgdGhlIGRlbnNpdHkgcmlkZ2VsaW5lcyBhcmUgc3RhY2tlZCB3aGljaCBhbGxvd3MgZm9yIHF1aWNrZXIgY29tcGFyaXNvbnMgYmV0d2VlbiBhY2NvdW50cyBpbiBkaWZmZXJlbnQgcmVnaW9ucy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0xNCwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb21iJT4lcGxvdF9ib3Rwcm9iX3JpZGdlcyhmaWxsID0gImRlbnMiLCBzY2FsZT0gNiwgb3B0aW9uID0gIkQiKStsYWJzKHRpdGxlPSAiQm90IFByb2JhYmlsaXRpZXMgb2YgcmV0d2VldGVycyIsIHN1YnRpdGxlPSJPcmRlcmVkIGJ5IGFzY2VuZGluZyBhdmVyYWdlIHJldHdlZXRlciBib3QgcHJvYiIsIGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCByZWNlbnQgcmV0d2VldGVycyBwZXIgYWNjb3VudCIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQojIENvbWJpbmVkIEpvaW4gRGF0ZSBhbmQgQm90IFByb2JhYmlsaXR5IEFuYWx5c2lzIA0KDQpUaGUgc3Bpa2VzIGluIHJldHdlZXRlcnMgd2l0aCBqb2luIGRhdGVzIGluIEphbnVhcnkgb2YgMjAxNyBhcmUgc3VzcGljaW91cy4gQSByZWFsbHkgc3Ryb25nIHNpZ25hbCBzZWVtcyB0byBiZSBwcmltYXJpbHkgcHJlc2VudCBvbiAiUmVzaXN0YW5jZSIgYW5kIG1haW5zdHJlYW0gZXN0YWJsaXNobWVudCBEZW1vY3JhdCBhY2NvdW50cy4gVG8gc2VlIHdoZXRoZXIgdGhlIGFjY291bnRzIHdpdGggSmFuIDIwMTcgam9pbiBkYXRlcyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgY2xhc3NpZmllZCBhcyBib3RzLCB3ZSB3aWxsIGZpcnN0IGNvbWJpbmUgdGhlIGJvdCBwcm9iYWJpbGl0eSBkYXRhIHNldHMgdGhhdCBoYXZlIHRoZSAyMDE3IHNpZ25hdHVyZToNCg0KLSBTaGFyZWJsdWUsIFJlc2lzdCwgVHJ1bXAtUnVzc2lhLCBhbmQgI1N0aWxsV2l0aEhlciBhY2NvdW50cw0KLSBBcmF2b3NpcyAmIGpvbmZhdnMgZnJvbSBwb2RjYXN0IHJlZ2lvbg0KLSBCZW4gV2l0dGxlcyBmcm9tIHdyaXRpbmcNCi0gUGFsbWVyUmVwb3J0IGFuZCBTaGFyZWJsdWUgZnJvbSBwdWJsaWNhdGlvbnMNCi0gS2FtYWxhIEhhcnJpcywgSm9lIEtlbm5lZHksIFNlbiBXYXJyZW4gYW5kIEpvZSBCaWRlbg0KDQoNCiMjIFNjYXR0ZXIgcGxvdCBvZiBhbGwgI1Jlc2lzdGFuY2UgYWNjb3VudHMNCg0KQSBzY2F0dGVyIHBsb3Qgd2l0aCB2ZXJ5IGxvdyBhbHBoYSBvbiB0aGUgcG9pbnRzIGdpdmVzIGFuIGlkZWEgb2Ygd2hlcmUgYWNjb3VudHMgYXJlIGNvbmNlbnRyYXRlZCBpbiB0ZXJtcyBvZiBqb2luIGRhdGUgYW5kIGJvdCBwcm9iYWJpbGl0eS4gDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnJlc2lzdGFuY2UlPiVnZ3Bsb3QoYWVzKGFjY291bnRfY3JlYXRlZF9hdCwgcHJvYl9ib3QpKStnZW9tX3BvaW50KGFscGhhID0gLjAxKSt0aGVtZV9pcHN1bSgic2FucyIpKyBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjIgeWVhciIsIGRhdGVfbGFiZWxzID0gIicleSIsIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgeWVhciIpK2xhYnMoeCA9ICJBY2NvdW50IENyZWF0aW9uIERhdGUiLCB5ID0gIkJvdCBQcm9iYWJpbGl0eSIpDQpgYGANCg0KIyMgSGVhdCBtYXBzDQojIyMgI1Jlc2lzdGFuY2UgYWNjb3VudHMsIGNvbWJpbmVkDQoNClZpc3VhbGl6aW5nIHRoZSBkYXRhIHVzaW5nIGEgaGVhdCBtYXAgaGVscHMgdG8gdmlzdWFsaXplIHdoZW4gYm90IGFjY291bnRzIHdlcmUgY3JlYXRlZC4gTWFueSBib3QgYWNjb3VudHMgd2VyZSBjcmVhdGVkIGR1cmluZyAyMDA5LiAyMDA5IHdhcyB0aGUgbW9zdCBmcmVxdWVudGx5IG9ic2VydmVkIGFjY291bnQgY3JlYXRpb24geWVhciwgYW5kIGl0IGFsc28gaGFkIHRoZSBncmVhdGVzdCBudW1iZXIgb2YgcmVhbCBhY2NvdW50cy4gSW50ZXJlc3RpbmdseSwgYSBoaWdoIGNvbmNlbnRyYXRpb24gb2YgYm90IGFjY291bnRzIHRoYXQgaGF2ZSBlYXJseSAyMDE3IGpvaW4gZGF0ZXMgd2FzIGFsc28gb2JzZXJ2ZWQuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpyZXNpc3RhbmNlJT4lIGdncGxvdChhZXMoYWNjb3VudF9jcmVhdGVkX2F0LCBwcm9iX2JvdCkpK2dlb21fYmluMmQoYmlucyA9IDQwKStzY2FsZV9maWxsX3ZpcmlkaXMoKSt0aGVtZV9pcHN1bSgic2FucyIpICsgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKStsYWJzKHggPSAiQWNjb3VudCBDcmVhdGlvbiBEYXRlIiwgeSA9ICJCb3QgUHJvYmFiaWxpdHkiKQ0KYGBgDQoNCiMjIyAjUmVzaXN0YW5jZSBhY2NvdW50cywgc2VwZXJhdGUNCg0KVG8gc2VlIGhvdyB1bmlmb3JtIHRoZSBib3QgY3JlYXRpb24gZGF0ZXMgYXJlIGFjcm9zcyBhY2NvdW50cyB3ZSBjYW4gcGxvdCB0aGUgc2FtZSB2aXN1YWxpemF0aW9uIGZvciBlYWNoIGFjY291bnQgdGhhdCB3YXMgcmV0d2VldGVkLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQpyZXNpc3RhbmNlJT4lZ2dwbG90KGFlcyhhY2NvdW50X2NyZWF0ZWRfYXQsIHByb2JfYm90KSkrZ2VvbV9iaW4yZChiaW5zID0gMTApK3NjYWxlX2ZpbGxfdmlyaWRpcygpK3RoZW1lX2lwc3VtKCJzYW5zIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkgKyBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjIgeWVhciIsIGRhdGVfbGFiZWxzID0gIicleSIsIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgeWVhciIpK2xhYnMoeCA9ICJBY2NvdW50IENyZWF0aW9uIERhdGUiLCB5ID0gIkJvdCBQcm9iYWJpbGl0eSIpDQpgYGANCg0KIyMgRGVuc2l0eSBwbG90cw0KDQpUaGUgYWJvdmUgaGVhdCBtYXBzIGFyZSBzaW1pbGFyIHRvIGhpc3RvZ3JhbXMgaW4gdGhhdCB0aGV5IHVzZSBiaW5zIHRvIHNwbGl0IHVwIHRoZSBkYXRhLiANCg0KVGhlIHBsb3QgYmVsb3cgdXNlcyB0aGUgMmQgZGVuc2l0eSB0byBtYXAgdGhlIGNvbG9yIGZpbGwgdmFsdWUgdG8uIFRoaXMgc21vb3RoZWQgdmlzdWFsaXphdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY29tcGFyZSBkZW5zaXRpZXMgb2YgYWNjb3VudCBjcmVhdGlvbiBkYXRlcyBhbmQgYm90IHByb2JhYmlsaXRpZXMgYWNyb3NzIGFjY291bnRzLg0KDQojIyMgI1Jlc2lzdGFuY2UgYWNjb3VudHMsIGNvbWJpbmVkDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0KcmVzaXN0YW5jZSU+JWdncGxvdChhZXMoYWNjb3VudF9jcmVhdGVkX2F0LCBwcm9iX2JvdCkpK3N0YXRfZGVuc2l0eTJkKGdlb20gPSAidGlsZSIsIGFlcyhmaWxsPS4uZGVuc2l0eS4uKSwgY29udG91ciA9IEYpK3NjYWxlX2ZpbGxfdmlyaWRpcygpK3RoZW1lX2lwc3VtKCJzYW5zIikgKyBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjIgeWVhciIsIGRhdGVfbGFiZWxzID0gIicleSIsIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgeWVhciIpK2xhYnMoeCA9ICJBY2NvdW50IENyZWF0aW9uIERhdGUiLCB5ID0gIkJvdCBQcm9iYWJpbGl0eSIpDQpgYGANCiMjIyAjUmVzaXN0YW5jZSBhY2NvdW50cywgc2VwZXJhdGUNClRoZSBzdHJvbmdlc3Qgc2lnbmFsIGlzIG9ic2VydmVkIG9uIE1hZGRvdydzIGFjY291bnQuDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQpyZXNpc3RhbmNlJT4lZ2dwbG90KGFlcyhhY2NvdW50X2NyZWF0ZWRfYXQsIHByb2JfYm90KSkrc3RhdF9kZW5zaXR5MmQoZ2VvbSA9ICJ0aWxlIiwgYWVzKGZpbGw9Li5kZW5zaXR5Li4pLCBjb250b3VyID0gRikrc2NhbGVfZmlsbF92aXJpZGlzKCkrdGhlbWVfaXBzdW0oInNhbnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKSArIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiMiB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiJyV5IiwgZGF0ZV9taW5vcl9icmVha3MgPSAiMSB5ZWFyIikrbGFicyh4ID0gIkFjY291bnQgQ3JlYXRpb24gRGF0ZSIsIHkgPSAiQm90IFByb2JhYmlsaXR5IikNCmBgYA0KDQojIyMgQ29tcGFyaXNvbiBvZiBUViB3aXRoIG90aGVyIHJlZ2lvbnMNCk5vdywgbGV0cyBjb21wYXJlIGFjY291bnRzIGluIHRoZSBUViByZWdpb24gd2l0aCB0aGUgbGVmdHkgYW5kIHdlaXJkIHJlZ2lvbnMuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0NCnJiaW5kKGxlZnQsIHdlaXJkLCBtc25iYyklPiVnZ3Bsb3QoYWVzKGFjY291bnRfY3JlYXRlZF9hdCwgcHJvYl9ib3QpKStzdGF0X2RlbnNpdHkyZChnZW9tID0gInRpbGUiLCBhZXMoZmlsbD0uLmRlbnNpdHkuLiksIGNvbnRvdXIgPSBGKStzY2FsZV9maWxsX3ZpcmlkaXMoKSt0aGVtZV9pcHN1bSgic2FucyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpICsgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKStsYWJzKHggPSAiQWNjb3VudCBDcmVhdGlvbiBEYXRlIiwgeSA9ICJCb3QgUHJvYmFiaWxpdHkiKQ0KYGBgDQoNCg0KIyMjIDIwMjAgUHJlc2lkZW50aWFsIHJlZ2lvbg0KRmluYWxseSwgbGV0cyBjb21wYXJlIHRoZSBwcmVzaWRlbnRpYWwgaG9wZWZ1bHMuIEl0IGxvb2tzIGxpa2UgS2FtYWxhIEhhcnJpcyBoYXMgdGhlIG1vc3QgMjAxNyByZXR3ZWV0IGJvdHMgb2YgdGhlc2UgYWNjb3VudHMsIGZvbGxvd2VkIGJ5IEpvZSBLZW5uZWR5IGFuZCBKb2UgQmlkZW4uIE5laXRoZXIgb2YgQmVybmllIFNhbmRlcnMnIGFjY291bnRzIGFyZSAgYm9vc3RlZCBieSBhdXRvbWF0ZWQgcmV0d2VldCBib3RzIHRvIHRoZSBkZWdyZWUgdGhhdCBLYW1hbGEgSGFycmlzIG9yIEpvZSBLZW5uZWR5IGFyZS4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwfQ0KcmJpbmQoc2FuZGVycyklPiVnZ3Bsb3QoYWVzKGFjY291bnRfY3JlYXRlZF9hdCwgcHJvYl9ib3QpKStzdGF0X2RlbnNpdHkyZChnZW9tID0gInRpbGUiLCBhZXMoZmlsbD0uLmRlbnNpdHkuLiksIGNvbnRvdXIgPSBGKStzY2FsZV9maWxsX3ZpcmlkaXMoKSt0aGVtZV9pcHN1bSgic2FucyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpICsgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKStsYWJzKHggPSAiQWNjb3VudCBDcmVhdGlvbiBEYXRlIiwgeSA9ICJCb3QgUHJvYmFiaWxpdHkiKQ0KDQpgYGANCiMgRm9sbG93ZXIgYW5hbHlzaXMgDQoNCkkgaGF2ZSBhbHNvIG9ic2VydmVkIGFjY291bnRzIGNyZWF0ZWQgYXJvdW5kIEphbnVhcnkgMjAxNyB0aGF0IGhhdmUgYmVlbiBmb2xsb3dpbmcsIGluIGFkZGl0aW9uIHRvIHJldHdlZXRpbmcsIHRoZSBhY2NvdW50cyBpbiBxdWVzdGlvbi4gRm9yIGV4YW1wbGUsIEBLYW1hbGFIYXJyaXMgaGFzIGJlZW4gcmVjZWl2aW5nIGZvbGxvd3MgZnJvbSBhY2NvdW50cyBjcmVhdGVkIGluIEphbiAnMTcgc2luY2Ugc2hvcnRseSBhZnRlciB0aGUgc2VuYXRvcidzIGFjY291bnQgd2FzIGNyZWF0ZWQuIEl0IGFwcGVhcnMgdGhhdCB0aGVzZSBib3QgZm9sbG93cyBhcmUgZW5naW5lZXJlZCB0byBwcm92aWRlIGEgc3VzdGFpbmVkIGZsb3cgb2YgbmV3IGZvbGxvd2VycyB0byB0aGUgYWNjb3VudCBvdmVyIGEgbG9uZyBwZXJpb2Qgb2YgdGltZS4gVGhpcyBpcyBldmlkZW5jZWQgYnkgdGhlIGhvcml6b250YWwgY2x1c3RlciBvZiBmb2xsb3dzIGNyZWF0ZWQgYXJvdW5kIEphbicxNy4gQWRkaW5nIG5ldyBib3QgZm9sbG93cyB0byBhbiBhY2NvdW50IGF0IGEgc2xvdyBhbmQgc3VzdGFpbmVkIHBhY2UgYWNjb21wbGlzaGVzIGEgZmV3IHRoaW5ncywgMSkgcGVvcGxlIGRvbid0IGdldCBzdXNwaWNpb3VzIHdoZW4gYW4gYWNjb3VudCBnYWlucyAxMDBrIGZvbGxvd2VycyBvdmVybmlnaHQsIDIpIG5vIGJ1cnN0IG9mIGZvbGxvd2VycyBtZWFucyB0aGF0IHRoZSAiY3J1c3QgYXQgdGhlIHRvcCIgZHVlIHRvIHRoZSAiam9pbiBhbmQgZm9sbG93IiBwaGVub21lbmEgZGVzY3JpYmVkIGluIHRoZSBOWVQgYXJ0aWNsZSByZW1haW5zIHVuYnJva2VuIChwdXJjaGFzaW5nIGZvbGxvd2VycyBpbiBidWxrIG9mdGVuIGJyZWFrcyB0aGUgY29udGludWl0eSBvZiB0aGUgZGFyayBjcnVzdCBhdCB0aGUgdG9wIG9mIHRoZSBwbG90KSwgYW5kIDMpIHN1c3RhaW5pbmcgdGhlIGZsb3cgb2YgbmV3IGZvbGxvd2VycyBsaWtlbHkgaGVscHMgdG8ga2VlcCBhbiBhY2NvdW50IHRyZW5kaW5nIGZvciBsb25nZXIgdGhhbiBpdCB3b3VsZCBoYXZlIG90aGVyd2lzZSBzbyB0aGUgYWNjb3VudCBzaG93cyB1cCBpbiBzdWdnZXN0ZWQgZm9sbG93cywgZXRjLg0KDQohW10oLi9rYW1hbGFoYXJyaXNfZmx3cnMucG5nKQ0KDQojIENvbmNsdXNpb24NCg0KSXQgaXMgY2xlYXIgZnJvbSB0aGUgYWJvdmUgYW5hbHlzZXMgdGhhdCB0aGVyZSBhcmUgYXV0b21hdGVkIHJldHdlZXQgYm90cyB0aGF0IGJvb3N0IHRob3NlIHdobyBhcmUgaW4gYW5kL29yIGRlZmVuZCB0aGUgZXN0YWJsaXNobWVudCBEZW1vY3JhdCBwYXJ0eS4NCiANClRoZXNlIGFtcGxpZmllciBhY2NvdW50cyBkb24ndCByZXR3ZWV0IGZyb20gdGhpcmQtcGFydHkgY2xpZW50cyAobGlrZSBTYWxseSBBbGJyaWdodCB3YXMgZG9pbmcpIHNvIHRoZWlyIGV4aXN0ZW5jZSBtdXN0IGJlIGNvbmZpcm1lZCBzdGF0aXN0aWNhbGx5LS0gdGhleSBhcmUgaW52aXNpYmxlIHRvIGEgc2luZ2xlIEFQSSBjYWxsIHRvIGdldCB0aGUgc291cmNlIGNsaWVudC4gVGhleSBhcHBlYXIgdG8gdXNlIChvciBlbXVsYXRlKSBhbmRyb2lkLCBpUGhvbmUsIGFuZCB3ZWIgY2xpZW50IHNvdXJjZSBjbGllbnRzIGF0IGFib3V0IGVxdWFsIHJhdGVzLiBGdXJ0aGVyLCB0aGUgYWNjb3VudHMgZG8gbm90IGhhdmUgcmV2ZXJzZS1pbWFnZSBzZWFyY2hhYmxlIHByb2ZpbGUgcGljdHVyZXMtLSB0aGV5IGFyZSB0eXBpY2FsbHkgcGljdHVyZXMgb2YgcGV0cywgbG9nb3MsIG9yIG9ic2N1cmVkIGZhY2VzLiANCg0KVGhlIHNjb3BlIG9mIHRoaXMgQXN0cm9UdXJmIG9wZXJhdGlvbiBpcyB2YXN0LiBDcmVhdGlvbiBvZiBhbiBhdXRvbWF0ZWQgYWNjb3VudCBuZXR3b3JrIHRoaXMgYWR2YW5jZWQgbGlrZWx5IGludm9sdmVkIGEgbWFzc2l2ZSB0ZWNobmljYWwgYW5kIGZpbmFuY2lhbCB1bmRlcnRha2luZy4gDQoNCiMgRnV0dXJlIGRpcmVjdGlvbnMNCg0KTmV4dCBzdGVwcyBhcmUgdG86DQoNCjEuIEdldCBhIGJldHRlciBpZGVhIGZvciB0aGUgc2NvcGUgb2YgdGhlIGJvdCBuZXQNCiAgICArIEhvdyBiaWcgaXMgaXQ/IA0KICAgICsgSXMgaXQgc3RpbGwgZ3Jvd2luZz8gDQoyLiBSZXZlcnNlIGVuZ2luZWVyIGhvdyB0aGUgbmV0d29yayBvcGVyYXRlcw0KICAgICsgVHJhY2sgZG93biB0aGUgd2F0Y2hlciBib3RzIGFuZCB0aGUgYW1wbGlmaWVycw0KICAgICsgQXJlIHRoZXkgaWRsZSB3YWl0aW5nIHRvIGdldCBhY3RpdmF0ZWQsIG9yIHBvc3RpbmcgY29uc3RhbnRseT8NCjMuIE5hcnJvdyBkb3duIHRoZSBKYW4nMTcgYWNjb3VudHMgdGhhdCBhcmUgbGlrZWx5IGJvdHMNCiAgICArIENvbmZpcm0gdGhhdCB0aGV5IGFyZSB1c2luZyB0aW1lIG1hcHBpbmcgYW5hbHlzZXMuIA0KICAgICsgVXNlIHRoaXMgdG8gZGV2ZWxvcCBhIG1vcmUgZGlyZWN0IHdheSBvZiBpZGVudGlmeWluZyBib3RzIGluIHRoZSBuZXR3b3JrDQoNCg==